/**
* Главный действующий объект
* @author Yura
*/

#ifndef TOBJECT_H
#define TOBJECT_H

#include <game/tgraphic.h>
#include <game/tobjectstate.h>
#include <core/config.h>


struct Rectangle{
    float left,right,top,bottom;
};

class TObject{
public:
    /// функции работы с получением/изменением данных объекта
    char             getType() const;

    const vector2d&  getPosition() const;
    TObject*         setPosition(vector2d position);

    TGraphic*        getGraphic() const;

    int              getState() const;
    TObject*         setState(int state);

    int              getId() const;
    TObject*         setId(int id);

    void             setVelocity(vector2d velocity);

    const vector2d&  getSize() const;
    TObject*         setSize(vector2d size);

    Rectangle getRectangle() const;

    /// то, что происходит с объектом за тик
    void tick();

    /// изменяет характеристики объекта за тик, уникальная для каждого типа
    virtual void move()=0;

    /// проверка пересечения двух объектов
    static bool rectangleCollision(const TObject& one, const TObject& two);

    /// взаимодействие двух объектов
    static bool interaction(TObject& one, TObject& two);

    /// жив ли объект
    bool checkIfAlive();

    TObject(TGraphic* graphic);
    ~TObject();

    /// получение полной информации об объекте в виде строки
    QString dump();

protected:
    vector2d     _position, _velocity, _size;
    char         _type;
    TObjectState _state;
    TGraphic*    _graphic;

private:
    int  _id;
    bool IsAlive;

    static bool interactionWallTank     (TObject& wall  , TObject& tank);
    static bool interactionWallBullet   (TObject& wall  , TObject& bullet);
    static bool interactionBulletTank   (TObject& bullet, TObject& tank);
    static bool interactionTankTank     (TObject& tank  , TObject& tank2);
    static bool interactionBulletBullet (TObject& bullet, TObject& bullet2);
};

#endif // TOBJECT_H
